home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / ABUSESRC.ZIP / AbuseSrc / imlib / port / mac / event.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-11  |  6.7 KB  |  279 lines

  1. #include "system.h"
  2. #include "image.hpp"
  3. #include "palette.hpp"
  4. #include "mdlread.hpp"
  5. #include "video.hpp"
  6. #include "gifread.hpp"
  7. #include "macs.hpp"
  8. #include "mouse.hpp"
  9. #include "event.hpp"
  10. #include "sprite.hpp"
  11.  
  12. #include <OSEvents.h>
  13.  
  14. extern CWindowPtr mainwin;
  15. const short MACEVENTS = mUpMask | mDownMask | keyUpMask | keyDownMask | autoKeyMask;
  16. short OldEventMask;
  17. EventRecord MacEv;
  18. int mmoved,mbed,mac_ready,keyed,mouse2ed;
  19. char mac_modifier[8],mac_oldmod[8];
  20. enum mac_modnum 
  21. {
  22.     MAC_COMMAND = 0x37,
  23.     MAC_LSHIFT,
  24.     MAC_CAPSLOCK,
  25.     MAC_LOPTION,
  26.     MAC_LCONTROL,
  27.     MAC_RSHIFT,
  28.     MAC_ROPTION,
  29.     MAC_RCONTROL,
  30.     MAC_LAST
  31. };
  32. int mac_map[8] = 
  33. {
  34.     JK_COMMAND,
  35.     JK_SHIFT_L,
  36.     JK_CAPS,
  37.     JK_ALT_L,
  38.     JK_CTRL_L,
  39.     JK_SHIFT_R,
  40.     JK_ALT_R,
  41.     JK_CTRL_R,
  42. };
  43.  
  44. void event_handler::flush_screen()
  45. {
  46.   update_dirty(screen);
  47. }
  48.  
  49. int event_handler::get_key_flags()
  50. {
  51.     return 0;
  52. }
  53.  
  54. int event_handler::event_waiting()
  55. {
  56.     unsigned char km[16];
  57.     int i;
  58.     
  59.     if (ewaiting || mmoved || mbed || mac_ready || keyed)
  60.         return 1;
  61.  
  62.     // Get key states & map to array
  63.     GetKeys((unsigned long*)&km);
  64.     for (i=0; i<MAC_LAST-MAC_COMMAND; i++) {
  65.         mac_modifier[i] = (km[ (i+MAC_COMMAND) >> 3 ] >> ((i+MAC_COMMAND) & 7)) & 1;
  66.         if (mac_modifier[i] != mac_oldmod[i])
  67.             keyed = 1;
  68.     }
  69.  
  70.     mouse->update();
  71.     mouse->set_button(mouse->button() | (mouse2ed << 1));
  72.     if (mouse->lastx() != mouse->x() || mouse->lasty() != mouse->y())
  73.     {
  74.         mmoved = 1;
  75.     }
  76.     if (mouse->last_button() != mouse->button())
  77.     {
  78.         mbed = 1;
  79.     }
  80.     
  81.     mac_ready = (mac_ready)? 1 : GetOSEvent(MACEVENTS,&MacEv);
  82.  
  83.     return ewaiting || mmoved || mbed || mac_ready || keyed;
  84. }
  85.  
  86. event_handler::event_handler(image *screen, palette *pal)
  87. {
  88.   CHECK(screen && pal);
  89.   mouse=new JCMouse(screen,pal);
  90.   mhere=1;
  91.   OldEventMask = *((short*)0x0144);
  92.     SetEventMask(MACEVENTS);
  93.   ewaiting=0;
  94.   mmoved = 0;
  95.   mac_ready = 0;
  96.   mouse2ed = 0;
  97. }
  98.  
  99. void event_handler::get_event(event &ev)
  100. {
  101. // 
  102.   int kf,kf_change=0;
  103.   event *ep;
  104.   
  105.   while (!event_waiting()) ;
  106.  
  107.   ep=(event *)events.first();
  108.   if (ep)
  109.   {
  110.       ev=*ep;
  111.     events.unlink((linked_node *)ep);
  112.     delete ep;
  113.     ewaiting = (events.first()!=NULL);
  114.   }
  115.   else if (mmoved) {
  116.       ev.type = EV_MOUSE_MOVE;
  117.     ev.mouse_move.x=mouse->x();
  118.     ev.mouse_move.y=mouse->y();
  119.     ev.mouse_button=mouse->button();
  120.     mouse->mouse_sprite()->x = mouse->x();
  121.     mouse->mouse_sprite()->y = mouse->y();
  122.       mmoved = 0;
  123.   }
  124.   else if (mbed) {
  125.     ev.mouse_move.x=mouse->x();
  126.     ev.mouse_move.y=mouse->y();
  127.     ev.mouse_button=mouse->button();
  128.     ev.type=EV_MOUSE_BUTTON;
  129.     mbed = 0;
  130.   }
  131.   else if (keyed) {
  132.       int found;
  133.       
  134.     ev.mouse_move.x=mouse->x();
  135.     ev.mouse_move.y=mouse->y();
  136.     ev.mouse_button=mouse->button();
  137.         found = -1;
  138.         keyed = 0;
  139.       for (int i=0; i<MAC_LAST-MAC_COMMAND; i++) 
  140.       {
  141.             if (mac_modifier[i] != mac_oldmod[i])
  142.                 if (found<0) 
  143.                     found = i;
  144.                 else
  145.                     keyed = 1;
  146.         }
  147.         ev.key = mac_map[found];
  148.         mac_oldmod[found] = mac_modifier[found];
  149.         if (mac_modifier[found])
  150.             ev.type = EV_KEY;
  151.         else
  152.             ev.type = EV_KEYRELEASE;
  153.     }
  154.   else if (mac_ready)
  155.   {
  156.     // note : that the mouse status
  157.     // should be know even if
  158.     // other event has occured
  159.     ev.mouse_move.x=mouse->x();
  160.     ev.mouse_move.y=mouse->y();
  161.     ev.mouse_button=mouse->button();
  162.  
  163.     switch (MacEv.what)
  164.     {
  165.          /*
  166.         case ConfigureNotify :
  167.               break;
  168.         case updateEvt :
  169.         {
  170.             ev.type=EV_REDRAW;
  171.           ev.redraw.x1=0;
  172.           ev.redraw.y1=0;
  173.           ev.redraw.x2=ev.redraw.x1+10;  // must replace this to redraw whole window!
  174.           ev.redraw.y2=ev.redraw.y1+10;
  175.           ev.redraw.start=NULL;
  176.         } break;
  177.       */
  178.       case keyDown :
  179.       case keyUp :
  180.       case autoKey :
  181.       {
  182.         if (MacEv.what==keyUp)
  183.           ev.type=EV_KEYRELEASE; 
  184.         else
  185.             ev.type=EV_KEY;
  186.         switch ((MacEv.message & keyCodeMask)>>8)
  187.         {
  188.             case 0x7d :     ev.key=JK_DOWN; break;
  189.           case 0x7e :      ev.key=JK_UP;  break;
  190.           case 0x7b :     ev.key=JK_LEFT;  break;
  191.           case 0x7c :     ev.key=JK_RIGHT;  break;
  192.           /*
  193.           case XK_Control_L :     ev.key=JK_CTRL_L;  break;
  194.           case XK_Control_R :     ev.key=JK_CTRL_R;  break;
  195.           case XK_Alt_L :         ev.key=JK_ALT_L;  break;
  196.           case XK_Alt_R :         ev.key=JK_ALT_R;  break;
  197.           case XK_Shift_L :     ev.key=JK_SHIFT_L;  break;
  198.           case XK_Shift_R :     ev.key=JK_SHIFT_R;  break;
  199.           */
  200.           case 0x47 :     ev.key=JK_NUM_LOCK;  break;
  201.           case 0x73 :     ev.key=JK_HOME;  break;
  202.           case 0x77 :     ev.key=JK_END;  break;
  203.           case 0x33 :        ev.key=JK_BACKSPACE;  break;
  204.           case 0x30 :        ev.key=JK_TAB;  break;
  205.           case 0x4c :        ev.key=JK_ENTER;  break;
  206.           case 0x39 :        ev.key=JK_CAPS;  break;
  207.             case 0x35 :        ev.key=JK_ESC;  break;
  208.              case 0x71 :   ev.key=JK_F1; break;
  209.           case 0x78 :   ev.key=JK_F2;break;
  210.           case 0x63 :   ev.key=JK_F3; break;
  211.           case 0x76 :   ev.key=JK_F4; break;
  212.           case 0x60 :   ev.key=JK_F5; break;
  213.           case 0x61 :   ev.key=JK_F6; break;
  214.           case 0x62 :   ev.key=JK_F7; break;
  215.           case 0x64 :   ev.key=JK_F8; break;
  216.           case 0x65 :   ev.key=JK_F9; break;
  217.           case 0x6d :   ev.key=JK_F10; break;
  218.               case 0x67 :   ev.key=JK_INSERT; break;
  219.               case 0x74 :   ev.key=JK_PAGEUP; break;
  220.               case 0x79 :   ev.key=JK_PAGEDOWN; break;
  221.               
  222.               case 0x52: // generate mouse 2 event
  223.                   mouse2ed = (ev.type == EV_KEY);
  224.                   ev.type = EV_MOUSE_BUTTON;
  225.                          mouse->set_button((mouse->button()&1) | (mouse2ed << 1));
  226.                      ev.mouse_button |= mouse->button();
  227.                      mbed = 1;
  228.                   break;
  229.           default :
  230.             // modifiers in event.modifiers
  231.                         ev.key = MacEv.message &charCodeMask;
  232.         }
  233.       } break;
  234.       /*
  235.       case MotionNotify : 
  236.       {
  237.         mouse->update(MacEv.xmotion.x,MacEv.xmotion.y,mouse->button());
  238.         ev.type=EV_MOUSE_MOVE;
  239.         ev.mouse_move.x=mouse->x();
  240.         ev.mouse_move.y=mouse->y();
  241.       } break;
  242.       */
  243.       /* now handled automatically 
  244.       case mouseUp :
  245.       case mouseDown :
  246.       { 
  247.         ev.type=EV_MOUSE_BUTTON;
  248.       } break;
  249.       */
  250.     }
  251.     mac_ready=0;
  252.   }
  253.   else
  254.       ev.type = EV_SPURIOUS;
  255. }
  256.  
  257.  
  258. void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start)
  259. {
  260.   event *ev;
  261.   ev=new event;
  262.   ev->type=EV_REDRAW;
  263.   ev->redraw.x1=X1; ev->redraw.x2=X2;
  264.   ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start;
  265.   events.add_end((linked_node *)ev);
  266. }
  267.  
  268. event_handler::~event_handler() 
  269. {
  270.     SetEventMask(OldEventMask);
  271.     delete mouse; 
  272. }
  273.  
  274.  
  275.  
  276.  
  277.  
  278.  
  279.